/**
 * 响应拦截器
 * 这是nestjs内置的拦截
 * 如果直接使用res.send()方法，会直接返回，不会经过拦截器
 * 
 * 拦截器的执行顺序分为两个部分：
    第一个部分在管道和自定义逻辑(next.handle()方法)之前。
    第二个部分在管道和自定义逻辑(next.handle()方法)之后。
 */

import { Injectable, NestInterceptor, CallHandler, ExecutionContext } from "@nestjs/common";
import { Observable } from "rxjs";
import { map } from 'rxjs/operators';


@Injectable()
export class ResponseInterceptor<T = any> implements NestInterceptor {
    intercept(context: ExecutionContext, next: CallHandler<any>): Observable<any> | Promise<Observable<any>> {
        const ctx = context.switchToHttp(); // 获取http上下文
        const res = ctx.getResponse(); // 获取响应对象
        const req = ctx.getRequest(); // 获取请求对象
        console.log('...全局响应拦截...')

        return next.handle().pipe(map(data => {
            console.log('...全局响应拦截返回内容...')

            return {
                code: 200,
                data: data.data || data,
                message: data.message || 'success'
            }
        }))
    }

}